package com.vepick.metier.requetes;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;

/*
 * Regroupe toutes les requetes de modification d'un client, abonn� ou ticket
 */
public class Requetes_client {
	
	/*
	 * Connexion du client abonn�, on verifie id et mdp avant d'ouvrir l'interface abonn� (return 1)
	 */
	public static int connecterAbo(Connection conn, int idClient,
			String mdpClient) throws SQLException {
		String mdp = null;
		String nom = null;
		Statement stmt = conn.createStatement();
		String query = "SELECT codeClient, nomAbo FROM CLIENT NATURAL JOIN CLIENTABO WHERE idClient="
				+ idClient+"AND dateFinValiditeAbo>=sysdate";
		ResultSet rs = stmt.executeQuery(query);

		while (rs.next()) {
			mdp = rs.getString("codeClient");
			nom = rs.getString("nomAbo");
		}
		rs.close();

		if (nom == null) {
			System.out.println("Abonne non reconnu");
			return 0;
		} else {
			if (!mdp.equals(mdpClient)) {
				System.out.println("Mauvais mot de passe");
				return -1;
			} else {
				System.out.println("Abonne connecte!");
				return 1;
			}
		}
	}
	
	/*
	 * Connexion du client ticket pour retour v�lo, on verifie id et mdp avant d'effectuer le retour v�lo (return 1)
	 */
	public static int connecterTicket(Connection conn, int idClient,
			String mdpClient) throws SQLException {
		String mdp = null;
		String nom = null;
		Statement stmt = conn.createStatement();
		String query = "SELECT codeClient, idClient FROM CLIENT NATURAL JOIN CLIENTTICKET WHERE idClient="
				+ idClient;
		ResultSet rs = stmt.executeQuery(query);

		while (rs.next()) {
			mdp = rs.getString("codeClient");
			nom = rs.getString("idClient");
		}
		rs.close();

		if (nom == null) {
			System.out.println("Ticket non reconnu");
			return 0;
		} else {
			if (!mdp.equals(mdpClient)) {
				System.out.println("Mauvais mot de passe");
				return -1;
			} else {
				System.out.println("Ticket connect�!");
				return 1;
			}
		}
	}
	
	/*
	 * Inscription d'un client au service VPick pour 1 an (ne prends pas en compte de paiement)
	 */
	public static void inscriptionAbo(Connection conn) throws SQLException {
		int idClient=-1;
		String dateFinValiditeAbo=null;
		//r�cup�ration de toutes les informations n�cessaires � l'inscription (bourrin...)
		@SuppressWarnings("resource")
		Scanner sc = new Scanner(System.in);
		System.out.println("Saisissez votre nom");
		String nomAbo = sc.nextLine();
		System.out.println("Saisissez votre pr�nom");
		String prenomAbo = sc.nextLine();
		System.out.println("Saisissez votre date de naissance (jj/mm/aaaa)");
		String dateNaisAbo = sc.nextLine();
		System.out.println("Saisissez votre sexe (H ou F)");
		String sexeAbo = sc.nextLine();
		System.out.println("Saisissez le num�ro de voie de votre adresse");
		String numRueAbo = sc.nextLine();
		System.out.println("Saisissez le nom de voie de votre adresse");
		String nomRueAbo = sc.nextLine();
		System.out.println("Saisissez le code postal de votre adresse");
		String cpAbo = sc.nextLine();
		System.out.println("Saisissez le nom de ville de votre adresse");
		String nomVilleAbo = sc.nextLine();
		System.out.println("Saisissez votre num�ro de carte bancaire");
		String numBanqueClient = sc.nextLine();
		System.out.println("Saisissez votre code confidentiel (4 chiffres)");
		String codeClient = sc.nextLine();
		Statement stmt = conn.createStatement();
		//cr�ation du client dans la table client
		String queryAjoutClient = "INSERT INTO CLIENT VALUES(idClient_seq.nextVal, '"
				+ codeClient + "', '" + numBanqueClient + "')";
		stmt.executeQuery(queryAjoutClient);
		//cr�ation du client dans la table ClientAbo
		String queryAjoutClientAbo = "INSERT INTO CLIENTABO VALUES(idClient_seq.currVal, '"
				+ nomAbo
				+ "', '"
				+ prenomAbo
				+ "', TO_DATE('"
				+ dateNaisAbo
				+ "', 'dd/mm/YYYY'), '"
				+ sexeAbo
				+ "', "
				+ numRueAbo
				+ ", '"
				+ nomRueAbo
				+ "', '"
				+ cpAbo
				+ "', '"
				+ nomVilleAbo
				+ "', sysdate + interval '1' year, 0)";
		stmt.executeUpdate(queryAjoutClientAbo);
		//On r�cup�re l'id et la validite du client cr�� pour affichage
		String query="SELECT idClient, dateFinValiditeAbo FROM Client NATURAL JOIN CLIENTABO WHERE idClient=(SELECT MAX(idClient) FROM Client)";
		ResultSet rs=stmt.executeQuery(query);
		while(rs.next()){
			idClient=rs.getInt("idClient");
			dateFinValiditeAbo=rs.getString("dateFinValiditeAbo");
		}
		conn.commit();
		System.out.println("Vous �tes d�sormais abonn� jusqu'au "+dateFinValiditeAbo.substring(0, 10)+". Identifiant: "+idClient+", code secret: "+codeClient);
	}

	/*
	 * M�thode qui permet de r�cup�rer la date de fin d'abonnement pour le renouvellement (affichage dans l'interface de renouvellement)
	 */
	public static String recupDateFinAbo(Connection conn, int idClient) throws SQLException{
		String dateFin=null;
		Statement stmt = conn.createStatement();
		String queryDateFin = "SELECT dateFinValiditeAbo FROM CLIENTABO where idClient="+idClient;
		ResultSet rs = stmt.executeQuery(queryDateFin);
		while(rs.next()){
			dateFin=rs.getString("dateFinValiditeAbo");
		}
		return dateFin;
	}
	
	/*
	 * M�thode qui permet le renouvellement d'un abonnement, qui est alors port� � date de fin initial + 1 an. Pas de paiement g�r�.
	 */
	public static void renouvelerAbonement(Connection conn, int idClient)
			throws SQLException {
		//on r�cup�re la date de fin d'abo initiale pour l'afficher dans l'interface de renouvellement de l'abonnement
		String dateFin=recupDateFinAbo(conn, idClient);
		String nouvelleDateFin=null;
		Statement stmt = conn.createStatement();
		//r�cup de la date de fin initiale
		String queryDateFin = "SELECT dateFinValiditeAbo FROM CLIENTABO where idClient="+idClient;
		ResultSet rs = stmt.executeQuery(queryDateFin);
		//on y rajoute un an
		String queryRenouvelerAbo = "UPDATE CLIENTABO SET dateFinValiditeAbo = (SELECT dateFinValiditeAbo + interval '1' year FROM CLIENTABO where idClient="+idClient+") where idClient=" + idClient;
		stmt.executeUpdate(queryRenouvelerAbo);
		//r�cup de la date de fin apres maj pour affichage
		rs = stmt.executeQuery(queryDateFin);
		while(rs.next()){
			nouvelleDateFin=rs.getString("dateFinValiditeAbo");
		}
		conn.commit();
		System.out.println("Votre abonnement terminant le "+dateFin.substring(0, 10)+" termine d�sormais le "+nouvelleDateFin.substring(0, 10));
	}

	/*
	 * Inscription d'un client ticket
	 */
	public static int inscriptionTicket(Connection conn) throws SQLException {
		Statement stmt = conn.createStatement();
		int idClient=-1;
		String codeClient=null;
		//on recupere les infos necessaires (juste num carte, le code est aleatoire)
		@SuppressWarnings("resource")
		Scanner sc = new Scanner(System.in);
		System.out.println("Saisissez votre num�ro de carte bancaire");
		String numBanqueClient= sc.nextLine();
		//on cr�� notre client ticket
		String queryAjoutClient = "INSERT INTO CLIENT VALUES(idClient_seq.nextVal, '"
				+ (int) ((Math.random() * 10000) - 1)
				+ "', '"
				+ numBanqueClient + "')";
		stmt.executeQuery(queryAjoutClient);
		//on r�cup�re les infos du client cr�� pour affichage
		String queryAjoutClientTicket = "INSERT INTO CLIENTTICKET VALUES(idClient_seq.currVal, null, null)";
		stmt.executeQuery(queryAjoutClientTicket);
		String query="SELECT idClient, codeClient FROM Client WHERE idClient=(SELECT MAX(idClient) FROM Client)";
		ResultSet rs=stmt.executeQuery(query);
		while(rs.next()){
			idClient=rs.getInt("idClient");
			codeClient=rs.getString("codeClient");
		}
		conn.commit();
		System.out.println("Identifiant de location: "+idClient+", code secret � conserver: "+codeClient);
		return idClient;
	}

}
